#!/bin/bash

echo "使用docker compose 开始构建镜像并启动容器,该镜像支持一个参数 1、指定镜像名称"
# 公共路径（挂载卷用到，确保容器内存在）
common_path=/planet/programs/planet-devops-business-server

##################################### 公共变量 ####################################################
# shellcheck disable=SC2164
# 进入到该目录，不然dockerfile中ADD时找不到文件路径(jenkins执行shell的默认路径是 /root可在当前shell中pwd打印查看)
cd $common_path
cur_path=$(pwd)
echo "当前路径：$cur_path"

# docker仓库用户名、密码
harbor_username=planet
harbor_password=planetAdmin@1998
harbor_addr=192.168.222.109:10010
# 镜像名称，获取执行shell脚本时第一个参数，不传默认 planet_devops_business_server
# 注：镜像、容器名称必须全部为小写
# 容器、镜像名称、项目名、镜像仓库名（也不建议外部传，写死就可）
app_name=${1:-"planet-devops-business-server"}

# 配置成docker compose默认读取的环境变量配置文件
ENV_FILE_NAME=".env"
CURRENT_TAG=0
SPRING_PROFILES_ACTIVE=prod
# 读取定义了环境信息的文件
if [[ -e "$common_path/$ENV_FILE_NAME" ]]; then
    tag_num=$(grep '^version=' $common_path/$ENV_FILE_NAME | cut -d'=' -f2)
    springProfilesActive=$(grep '^SPRING_PROFILES_ACTIVE=' $common_path/$ENV_FILE_NAME | cut -d'=' -f2)
    echo "$common_path/$ENV_FILE_NAME exist,tag_num is: $tag_num, SPRING_PROFILES_ACTIVE is: $springProfilesActive"
    # 判断tag_num是否为空
    if [[ -z $tag_num ]]; then
        echo "$common_path/$ENV_FILE_NAME,file attr:version is null,will auto fill default value: 0"
        tag_num=0
    else
        echo "$common_path/$ENV_FILE_NAME,file attr:version is not null,value is: $tag_num"
    fi
    CURRENT_TAG=$tag_num

    # 判断springProfilesActive是否为空
    if [[ -z $springProfilesActive ]]; then
        echo "$common_path/$ENV_FILE_NAME,file attr:SPRING_PROFILES_ACTIVE is null,will auto fill default value: prod"
        springProfilesActive=prod
    else
        echo "$common_path/$ENV_FILE_NAME,file attr:SPRING_PROFILES_ACTIVE is not null,value is: $springProfilesActive"
    fi
    SPRING_PROFILES_ACTIVE=$springProfilesActive
else
    echo "$common_path/$ENV_FILE_NAME,File does not exist，will create and write content."
    touch $common_path/$ENV_FILE_NAME
    CURRENT_TAG=0
    SPRING_PROFILES_ACTIVE=prod
fi
echo "current image tag num is: $CURRENT_TAG"
# 计算新的版本号
FINAL_IMAGE_TAG=$((CURRENT_TAG + 1))
# 设置/跟新 新的版本号（环境变量,不推荐，只在当前shell会话中生效，不能永久保存）
#export IMAGE_TAG=$FINAL_IMAGE_TAG
# 打印一下
echo "Final IMAGE_TAG is: $FINAL_IMAGE_TAG"
########################## 写入$ENV_FILE_NAME环境变量配置文件（.env） ####################################
# 检查SPRING_PROFILES_ACTIVE是否为空
if grep -q "^SPRING_PROFILES_ACTIVE=" "$common_path/$ENV_FILE_NAME"; then
  # 如果存在SPRING_PROFILES_ACTIVE配置项，则更新其值
  sed -i "s/^SPRING_PROFILES_ACTIVE=.*/SPRING_PROFILES_ACTIVE=$SPRING_PROFILES_ACTIVE/" "$common_path/$ENV_FILE_NAME"
else
  # 如果不存在SPRING_PROFILES_ACTIVE配置项，则添加
  echo "Adding missing SPRING_PROFILES_ACTIVE to .env"
  echo "SPRING_PROFILES_ACTIVE=$SPRING_PROFILES_ACTIVE" >> "$common_path/$ENV_FILE_NAME"
fi

# 检查version是否设置
if grep -q "^version=" "$common_path/$ENV_FILE_NAME"; then
  # 如果存在version配置项，则更新其值
  sed -i "s/^SPRING_PROFILES_ACTIVE=.*/SPRING_PROFILES_ACTIVE=$SPRING_PROFILES_ACTIVE/" "$common_path/$ENV_FILE_NAME"
  sed -i "s/^version=.*/version=$FINAL_IMAGE_TAG/" $common_path/$ENV_FILE_NAME
else
  # 如果不存在version配置项，则添加
  echo "Adding missing version to .env"
  echo "version=$FINAL_IMAGE_TAG" >> $common_path/$ENV_FILE_NAME
fi
########################## 写入环境变量配置文件（.env）结束 ####################################

# 获得docker容器id和镜像id，查询 app_name容器信息，并获取列表第一个($1)参数
# shellcheck disable=SC2006
container_ids=`docker ps -a | grep "$app_name" | awk '{print $1 }'`
# shellcheck disable=SC2006
img_ids=`docker images | grep "$app_name" | awk '{print $3 }'`

########################################## 方案1：使用docker compose 构建镜像并启动容器 ##########################################

# 如果容器正在运行，停止它
while IFS= read -r container_id; do
  # 获取容器状态
  status=$(docker inspect --format='{{.State.Status}}' "$container_id")
  # 这里也可以不用加状态判断，直接停止删除
  if [[ "$status" = "running" || "$status" = "restarting" ]]; then
    echo "Stopping $status container: $container_id"
    docker stop "$container_id"
    echo "Delete container: $container_id"
    docker rm -f "$container_id"
  fi
done <<< "$container_ids"

# 删除镜像
while IFS= read -r img_id; do
  echo "delete image: $img_id"
  docker rmi -f "$img_id"
done <<< "$img_ids"

# 构建镜像并启动容器
# --scale planet-devops-business-server1=3 [启动多个容器 serviceName=num]
docker compose up -d


##################################### 公共部分，镜像打tag,并推送到私有仓库 ##################################
## 登录仓库(如果是公有仓库的话不需要登录)
docker login -u "$harbor_username" -p "$harbor_password" "$harbor_addr"

## 打标签,参数解释：docker tag 源镜像名:版本号 镜像仓库地址(完整地址IP:PORT,80的话可省略)/目标仓库/目标镜像名:版本号
# 目标仓库名称和项目名称一致
docker tag "$app_name":"$FINAL_IMAGE_TAG" "$harbor_addr"/"$app_name"/"$app_name":"$FINAL_IMAGE_TAG"

## 推送到镜像仓库(提前在镜像仓库创建名为app_name的仓库) 用户名/仓库名:版本号
## 一直超时（待处理：网络问题）
docker push "$harbor_addr"/"$app_name"/"$app_name":"$FINAL_IMAGE_TAG"
